import cv2

#只需用到灰度图
gray = cv2.imread("bookpage.jpg", cv2.IMREAD_GRAYSCALE)
#阈值分割
#ret是一个布尔值，代表是否成功分割。
#threshold是一个二维数组，其中每个元素都是一个二维数组，代表一个角点的坐标。
#gray是输入的图像。
#10是阈值，小于阈值的像素点会被置为0，大于阈值的像素点会被置为255。
#255是最大值，用于将像素点的值归一化到0到255之间。
#cv2.THRESH_BINARY是阈值类型，这里是二值化类型。
ret, threshold = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)
#自适应阈值分割
#adaptiveThreshold函数返回的是一个二维数组，其中每个元素都是一个二维数组，代表一个角点的坐标。
#gray是输入的图像。
#255是最大值，用于将像素点的值归一化到0到255之间。
#cv2.ADAPTIVE_THRESH_GAUSSIAN_C是自适应阈值类型，这里是高斯加权类型。
#cv2.THRESH_BINARY是阈值类型，这里是二值化类型。
#115是邻域大小，用于计算每个像素点的加权平均值。
#1是常数，用于减去加权平均值。
threshold_adaptaive = cv2.adaptiveThreshold(
    gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)
#Otsu阈值分割
#ret1是一个布尔值，代表是否成功分割。
#threshold_otsu是一个二维数组，其中每个元素都是一个二维数组，代表一个角点的坐标。
#gray是输入的图像。
#0是阈值，这里是0，因为Otsu阈值分割会自动计算阈值。
#255是最大值，用于将像素点的值归一化到0到255之间。
#cv2.THRESH_BINARY + cv2.THRESH_OTSU是阈值类型，这里是二值化类型和Otsu阈值类型。
ret1, threshold_otsu = cv2.threshold(
    gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

cv2.imshow("gray", gray)
cv2.imshow("threshold", threshold)
cv2.imshow("threshold_adaptaive", threshold_adaptaive)
cv2.imshow("threshold_otsu", threshold_otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()